package com.gradumate.client.gui;

import java.util.logging.Logger;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.gradumate.client.Element;
import com.gradumate.client.GraduMate;
import com.gradumate.client.service.GraduMateService;
import com.gradumate.client.service.GraduMateServiceAsync;
import com.gradumate.shared.Gebruiker;

/**
 * Klasse die gebruikt word om een student geforceerd toegang te geven tot het
 * systeem.
 * 
 * @author Hugo Zonderland
 */
public class StudentToegangVerlenen {

	// AsyncService
	private GraduMateServiceAsync server = GWT.create(GraduMateService.class);

	// Logger
	private final Logger log = Logger.getLogger(StudentToegangVerlenen.class
			.getName());

	// Element
	private Element element = new Element();

	// Widgets
	private TextBox txtStudentNummer;
	private Button btnZoek, btnAnnuleren, btnToegangVerlenen;
	private Label lblZoekGebruiker;
	private Image imgZoekGebruiker;
	private FlexTable flxTable, flxTableStudent;

	// Table row counter
	int row, studentRow;

	/**
	 * Constructor
	 */
	public StudentToegangVerlenen() {
		
		// Loading-gif plaatsen.
		GraduMate.setLoadingImage(true);
		GraduMate.clearStatusMessages();

		// Table aanmaken
		flxTable = new FlexTable();
		flxTable.setCellSpacing(3);
		row = 0;
		
		// loading gif instellen
		imgZoekGebruiker = element.getLoadingGif();
		imgZoekGebruiker.setVisible(false);
		lblZoekGebruiker = element.getLabel("gebruiker ophalen..");
		lblZoekGebruiker.setVisible(false);
		
		// Introductie
		FlexTable flxIntro = new FlexTable();
		flxIntro.setWidget(0, 0, element.getHeaderLabel("Toegang verlenen"));
		flxIntro.setWidget(1, 0, element.getLabel("Op deze pagina is het mogelijk een student toegang te verlenen tot het systeem."));
		flxIntro.setWidget(2, 0, element.getLabel("Vul in het invoerveld het studentnummer van de student in."));
		
		// Studentnummer
		txtStudentNummer = new TextBox();
		flxTable.setWidget(row, 0, element.getLabel("Studentnummer"));
		flxTable.setWidget(row, 1, txtStudentNummer);
		flxTable.setWidget(row, 2, lblZoekGebruiker);
		flxTable.setWidget(row, 3, imgZoekGebruiker);
		row++;
		
		// Zoek button + ClickEvent
		btnZoek = element.getButton("Zoek student", "Zoek student", "magnifier.png");
		btnZoek.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				zoekStudent();
			}
		});
		btnAnnuleren = element.getButton("Annuleren", "Stop, ga terug", "cancel.png");
		btnAnnuleren.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent e) {
				new GebruikerHome();
			}
		});
		flxTable.setWidget(row, 0, btnZoek);
		flxTable.setWidget(row, 1, btnAnnuleren);
		row++;
		
		// Main leeg maken + elementen plaatsen
		RootPanel.get("main").clear();
		RootPanel.get("tabpanel").clear();
		RootPanel.get("main").add(flxIntro);
		RootPanel.get("main").add(flxTable);
	}
	
	private void zoekStudent() {
		GraduMate.clearStatusMessages();
		
		// Laad image plaatsen
		setZoekStatus(true);
		
		// Studentnummer bepalen
		final int studentNummer = Integer.parseInt(txtStudentNummer.getValue());
		// TODO: Validatie van studentnummer
		
		server.getGebruikerByStudentnummer(studentNummer, new AsyncCallback<Gebruiker>() {

			public void onFailure(Throwable caught) {
				// Laad image uitzetten
				setZoekStatus(false);
				
				log.info("getGebruikerByStudentnummer(" + studentNummer + ") | AsyncCallback " + caught.getMessage());
				GraduMate.addAsyncError();
			}

			public void onSuccess(final Gebruiker g) {
				// Laad image uitzetten
				setZoekStatus(false);
				
				if (g != null) {
					// Studenttable
					flxTableStudent = new FlexTable();
					flxTableStudent.setCellSpacing(3);
					studentRow = 0;
					
					// Studentnaam
					flxTableStudent.setWidget(studentRow, 0, element.getLabel("Student"));
					flxTableStudent.setWidget(studentRow, 1, element.getLabel(g.getVoornaam() + " " + g.getAchternaam()));
					studentRow++;
					
					// Student e-mail
					flxTableStudent.setWidget(studentRow, 0, element.getLabel("Email"));
					flxTableStudent.setWidget(studentRow, 1, element.getLabel(g.getGebruikerEmail()));
					studentRow++;
					
					// Button
					btnToegangVerlenen = element.getButton("Toegang verlenen", "Toegang verlenen", "user_add.png");
					btnToegangVerlenen.addClickHandler(new ClickHandler() {
						public void onClick(ClickEvent e) {
							toegangVerlenen(g);
						}
					});
					flxTableStudent.setWidget(studentRow, 0, btnToegangVerlenen);
					
					// Op panel plaatsen
					RootPanel.get("main").add(flxTableStudent);
		
				} else {
					GraduMate.addErrorMsg("Er is geen student gevonden met dat studentnummer.");
				}
			}
		});
	}
	
	/**
	 * Verleend toegang aan de student.
	 * 
	 * @param Gebruiker g
	 */
	private void toegangVerlenen(final Gebruiker g) {
		server.verleenToegang(g.getStudentNummer(), new AsyncCallback<Boolean>() {

			public void onFailure(Throwable caught) {
				log.info("verleenToegang(" + g.getStudentNummer() + ") | AsyncCallback " + caught.getMessage());
				GraduMate.addAsyncError();
			}

			public void onSuccess(Boolean result) {
				if (result) {
					GraduMate.addSuccessMsg("De student kan nu inloggen.");
				} else {
					GraduMate.addErrorMsg("Deze student heeft al toegang.");
				}
			}
		});
	}
	
	/**
	 * Plaatje op de Save button plaatsen, leuke feature.
	 * @param show
	 */
	private void setZoekStatus(boolean show) {
		if (show) {
			btnZoek.setHTML("Student ophalen.. " + element.getImage("Laden..", "ajax-loader.gif").toString());
		} else {
			btnZoek.setHTML("Zoek student" + element.getImage("Zoek student", "magnifier.png").toString());
		}
	}
}


